package com.aust.annotation;

import java.lang.reflect.Method;

/**
 * 1.获取类对象
 * 2.获取所有方法对象/获取指定方法对象
 * 3.判断是否存在注解
 * 4.获取注解对象
 * 5.获取方法上注解对应值
 * <p>
 * 获取指定方法对象与属性对象都需要指定操作的是哪个对象
 */

/**
 * 正向：
 * 1.获取实例对象
 * 2.调用方法
 * 反射：
 * 1.获取类对象
 * 2.获取类构造器对象
 * 3.获取实例对象
 * 4.获取指定方法
 * 5.执行指定对象的指定方法
 */
public class Test5 {
    @Annotation5("添加用户")
    public void addUser() {
        System.out.println("正在添加用户。。。");
    }

    public static void main(String[] args) throws Exception {
        /**
         * 获取类对象
         */
        Class<Test5> test5Class = Test5.class;
        /**
         * 遍历所有方法
         */
        for (Method declaredMethod : test5Class.getDeclaredMethods()) {
            /**
             * 判断方法上是否有@Annotation5注解
             */
            if (declaredMethod.isAnnotationPresent(Annotation5.class)) {
                /**
                 * 获取注解对象
                 */
                Annotation5 annotation = declaredMethod.getAnnotation(Annotation5.class);
                /**
                 * 获取注解属性值
                 */
                String value = annotation.value();
                System.out.println("发现注解：@Annotation，值为：" + value);
                /**
                 * 执行额外逻辑
                 * 根据类对象获取构造方法创建对象
                 * 反射执行指定对象的指定方法
                 */
                Test5 test5 = test5Class.getDeclaredConstructor().newInstance();
                declaredMethod.invoke(test5);
            }
        }
    }
}
